package sv.com.canales.controlador;


import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import sv.com.canales.modelo.Usuario;

import java.util.ArrayList;
import java.util.List;

public class UsuarioControlador {
    private final String TABLA = "USUARIO";
    private final String[] TODAS_COLUMNAS= {"ID","PSEUDONIMO","CONTRASENA","CORREO","IMAGEN"};
    private SQLiteDatabase sqlLiteDatabase;
    private ConectorSqlLite conectorSqlLite;

    public UsuarioControlador(Context context){
        this.conectorSqlLite = new ConectorSqlLite(context);
    }


    public void abrirConexionActualizacion(){
        this.sqlLiteDatabase = this.conectorSqlLite.getWritableDatabase();
    }

    public void abrirConexionLectura(){
        this.sqlLiteDatabase = this.conectorSqlLite.getReadableDatabase();
    }

    public void cerrarConexion(){
        this.sqlLiteDatabase.close();
    }


    public void crearUsuario(Usuario u) throws Exception{
        ContentValues values = new ContentValues();
        values.put("pseudonimo", u.getPseudonimo());
        values.put("contrasena", u.getContrasena());
        values.put("correo", u.getCorreo());
        values.put("imagen", u.getImagen());

        abrirConexionActualizacion();
        long insertId = this.sqlLiteDatabase.insert(this.TABLA, null, values);
        u.setIdentificador(insertId);
        cerrarConexion();
    }




    public void eliminarUsuario(Usuario u)throws Exception{
        abrirConexionActualizacion();
        this.sqlLiteDatabase.delete(this.TABLA,"id = " +u.getIdentificador(), null);
        cerrarConexion();
    }

    public void modificarUsuario(Usuario u)throws Exception{
        ContentValues values = new ContentValues();
        values.put("pseudonimo", u.getPseudonimo());
        values.put("contrasena", u.getContrasena());
        values.put("correo", u.getCorreo());
        values.put("imagen", u.getImagen());
        abrirConexionActualizacion();
        this.sqlLiteDatabase.update(this.TABLA, values,"id = " + u.getIdentificador(),null);
        cerrarConexion();
    }

    public Usuario validarUsuario(String usuario, String contrasena){
        Usuario u = null;
        abrirConexionLectura();
        Cursor query = this.sqlLiteDatabase.query(this.TABLA, this.TODAS_COLUMNAS, "pseudonimo='"+usuario +"' AND contrasena = '"+contrasena+"'",null,null,null,null);
        if(query.moveToFirst())
            u = convertirCursorUsuario(query);
        cerrarConexion();
        return u;
    }

    public Usuario buscarUsuarioPorUsuario(String pseudonimo){
        Usuario u = null;
        abrirConexionLectura();
        Cursor query = this.sqlLiteDatabase.query(this.TABLA, this.TODAS_COLUMNAS, "pseudonimo='"+pseudonimo+"'",null,null,null,null);
        if(query.moveToFirst())
            u = convertirCursorUsuario(query);
        cerrarConexion();
        return u;
    }


    public Bitmap buscarImagenUsuario(String usuario){
        byte[] imgByte = null;
        abrirConexionLectura();
        Cursor query = this.sqlLiteDatabase.query(this.TABLA, new String[]{"IMAGEN"}, "pseudonimo='"+usuario+"'",null,null,null,null);
        if(query.moveToFirst())
            imgByte= query.getBlob(0);
        cerrarConexion();
        if(imgByte!=null)
            return BitmapFactory.decodeByteArray(imgByte, 0, imgByte.length);
        else
            return null;
    }


    public List<Usuario> todosUsuarios(){
        List<Usuario> usuarios = new ArrayList<Usuario>();
        abrirConexionLectura();
        Cursor cur = this.sqlLiteDatabase.query(this.TABLA,this.TODAS_COLUMNAS,null,null,null,null,null);
        while(cur.moveToNext()){
            usuarios.add(convertirCursorUsuario(cur));
        }
        cerrarConexion();
        return usuarios;

    }


    public Long[] todosIdentificadores(){
        List<Long> usuarios = new ArrayList<Long>();
        abrirConexionLectura();
        Cursor cur = this.sqlLiteDatabase.query(this.TABLA,new String[]{"ID"},null,null,null,null,null);
        while(cur.moveToNext()){
            usuarios.add(cur.getLong(0));
        }
        cerrarConexion();
        return usuarios.toArray(new Long[0]);

    }


    public String[] todosPseudonimos(){
        List<String> usuarios = new ArrayList<String>();
        abrirConexionLectura();
        Cursor cur = this.sqlLiteDatabase.query(this.TABLA,new String[]{"PSEUDONIMO"},null,null,null,null,null);
        while(cur.moveToNext()){
            usuarios.add(cur.getString(0));
        }
        cerrarConexion();
        return usuarios.toArray(new String[0]);

    }


    public String[] todosPseudonimosPorCadena(String cadena){
        List<String> usuarios = new ArrayList<String>();
        abrirConexionLectura();
        Cursor cur = this.sqlLiteDatabase.query(this.TABLA,new String[]{"PSEUDONIMO"},"PSEUDONIMO like '%"+cadena+"%'",null,null,null,null);
        while(cur.moveToNext()){
            usuarios.add(cur.getString(0));
        }
        cerrarConexion();
        return usuarios.toArray(new String[0]);

    }




    private Usuario convertirCursorUsuario(Cursor query) {
        Usuario u = new Usuario();
        u.setIdentificador(query.getLong(0));
        u.setPseudonimo(query.getString(1));
        u.setContrasena(query.getString(2));
        u.setCorreo(query.getString(3));
        u.setImagen(query.getBlob(4));
        return u;
    }

}
